package net.eyra.negocio.explotacion.mantenimiento;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.eyra.negocio.dao.ExplotacionDao;
import net.eyra.negocio.dao.EyraDaoException;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.negocio.entidades.explotacion.Parque;
import net.eyra.negocio.entidades.explotacion.Tarificador;
import net.eyra.utiles.FormateoFechaException;

public class ComprobarCurvas {

    private ExplotacionDao dao = null;

    public ComprobarCurvas() {
        dao = new ExplotacionDao();
    }

    /**
     * Corrige en la BD la cuartohoraria que tiene mal el cierre del último cuarto (suma lo mismo que la horaria). Se le pasa la hora de la horaria.
     * 
     * @param id_tarificador
     * @param hora
     *            Va desde la 1 a las 24
     * @param periodo
     *            Fecha en formato yyyy-MM-dd
     * @throws FormateoFechaException
     */
    public void CorregirMedida(int id_tarificador, int hora, String periodo) throws FormateoFechaException {
        try {
            final List<Lectura> lecturas = dao.getLecturas(id_tarificador, hora, periodo);
            double im = 0;
            double ex = 0;
            double r1 = 0;
            double r2 = 0;
            double r3 = 0;
            double r4 = 0;
            for (int x = 0; x < 3; x++) {
                im += lecturas.get(x).getActiva_importada();
                ex += lecturas.get(x).getActiva_exportada();
                r1 += lecturas.get(x).getReactiva_q1();
                r2 += lecturas.get(x).getReactiva_q2();
                r3 += lecturas.get(x).getReactiva_q3();
                r4 += lecturas.get(x).getReactiva_q4();
            }
            lecturas.get(3).setActiva_importada(lecturas.get(3).getActiva_importada() - im);
            lecturas.get(3).setActiva_exportada(lecturas.get(3).getActiva_exportada() - ex);
            lecturas.get(3).setReactiva_q1(lecturas.get(3).getReactiva_q1() - r1);
            lecturas.get(3).setReactiva_q2(lecturas.get(3).getReactiva_q2() - r2);
            lecturas.get(3).setReactiva_q3(lecturas.get(3).getReactiva_q3() - r3);
            lecturas.get(3).setReactiva_q4(lecturas.get(3).getReactiva_q4() - r4);

            dao.setLectura(lecturas.get(3));
        } catch (EyraDaoException e) {
            e.printStackTrace();
        }
    }

    /**
     * Devuelve la lista de parques pasada como parametro, con la última medida de cada parque tanto para horaria como cuartohoraria.
     * 
     * @param parques
     *            Debe contener, por cada parque, los tarificadores asociados a ese parque para que le queramos comprobar la fecha.
     * @return. Creará por cada tarificador dos objetos Lectura, uno para la horaria y otro para la cuartohoraria, con el dato de última fecha en el
     *          atributo 'fecha'
     * @throws EyraDaoException
     */
    public List<Parque> UltimaLecturaDeMedidas(List<Parque> parques) throws EyraDaoException {
        for (Parque parque : parques) {
            for (Tarificador tarificador : parque.getTarificadores()) {
                Lectura lectura = new Lectura();
                Date fecha = dao.getUltimaFechaRegistradaPorTarificador(tarificador.getId_tarificador(), true);
                lectura.setFecha(fecha);
                List<Lectura> lecturas = new ArrayList<Lectura>();
                lecturas.add(lectura);
                tarificador.setLecturas_tm1(lecturas);
                lectura = new Lectura();
                fecha = dao.getUltimaFechaRegistradaPorTarificador(tarificador.getId_tarificador(), false);
                lectura.setFecha(fecha);
                lecturas = new ArrayList<Lectura>();
                lecturas.add(lectura);
                tarificador.setLecturas_tm2(lecturas);
            }
        }
        return parques;
    }

    /**
     * Devuelve el parque pasado como parametro, con la última medida tanto para horaria como cuartohoraria.
     * 
     * @param parque
     *            Debe contener los tarificadores asociados a ese parque para que le queramos comprobar la fecha.
     * @return Creará por cada tarificador dos objetos Lectura, uno para la horaria y otro para la cuartohoraria, con el dato de última fecha en el
     *         atributo 'fecha'
     * @throws EyraDaoException
     */
    public Parque UltimaLecturaDeMedidas(Parque parque) throws EyraDaoException {
        for (Tarificador tarificador : parque.getTarificadores()) {
            Lectura lectura = new Lectura();
            Date fecha = dao.getUltimaFechaRegistradaPorTarificador(tarificador.getId_tarificador(), true);
            lectura.setFecha(fecha);
            List<Lectura> lecturas = new ArrayList<Lectura>();
            lecturas.add(lectura);
            tarificador.setLecturas_tm1(lecturas);
            fecha = dao.getUltimaFechaRegistradaPorTarificador(tarificador.getId_tarificador(), false);
            lectura.setFecha(fecha);
            lecturas = new ArrayList<Lectura>();
            lecturas.add(lectura);
            tarificador.setLecturas_tm2(lecturas);
        }
        return parque;
    }

    /**
     * @param fecha
     * @param lecturas
     * @return Regresa un objeto lectura de 'lecturas' para la fecha indicada o un objeto con todas las lecturas a cero en caso de no encontrarla
     */
    private Lectura BuscarLecturaPorFecha(Date fecha, List<Lectura> lecturas) {
        for (int x = 0; x < lecturas.size(); x++) {
            if (fecha.compareTo(lecturas.get(x).getFecha()) == 0) return lecturas.get(x);
        }
        Lectura lectura = new Lectura();
        lectura.setFecha(fecha);
        return lectura;
    }
}
